/*
 * 
 */
package mx.unam.acatlan.poo.practica2;


/**
 * @author Carlos Alegría Galicia
 *
 */
public class ImplementaciónDePila implements Pila {

	/** El arreglo que contiene los elementos de esta pila */
	private Object elementos[];
	
	/** La posición en {@link #elementos} que indica la cabeza de la pila */
	private int indice;
	
	/**
	 * Crea una {@link Pila} que puede almacenar el número de elementos
	 * especificado por <code>capacidad</code>.
	 * 
	 * @param capacidad El número máximo de elementos que puede almacenar la
	 *                  pila.
	 */
	public ImplementaciónDePila(int capacidad) {
		this.elementos = new Object[capacidad];
		this.indice = 0;
	}
	
	/**
	 * Crea una {@link Pila} que puede almacenar hasta 10 elementos.
	 */
	public ImplementaciónDePila() {
		this(10);
	}
	
	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.Pila#push(java.lang.Object)
	 */
	public void push(Object elemento) {
		if (this.indice < this.elementos.length) {
			this.elementos[this.indice++] = elemento;
		}
	}

	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.Pila#pop()
	 */
	public Object pop() {
		if (this.indice >= 0) {
			Object elemento = this.elementos[--this.indice];
			this.elementos[this.indice] = null;
			
			return elemento;
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.Pila#tamaño()
	 */
	public int getTamaño() {
		return this.indice;
	}
	
	/* (non-Javadoc)
	 * @see mx.unam.acatlan.poo.practica2.Pila#getCapacidad()
	 */
	public int getCapacidad() {
		return this.elementos.length;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		String cadena = "";
		if (this.indice > 0) {
			cadena = this.elementos[0].toString();
			for (int i = 0; i < this.indice; i++) {
				cadena += ", " + this.elementos[i];
			}
		}
		return "{" + cadena + "}";
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ImplementaciónDePila pilaDeObjetos = new ImplementaciónDePila();
		
		// insertamos objetos en la pila
		//
		pilaDeObjetos.push(new Object());
		pilaDeObjetos.push("cadena");
		pilaDeObjetos.push(new ImplementaciónDePila());
		
		// imprimimos el contenido de la pila 
		//
		System.out.println("contenido de la pila: " + pilaDeObjetos);
		
		// quitamos objetos de la pila, e imprimimos el resultado del método
		// toString() en la salida estándar
		//
		System.out.println("primer objeto  = " + pilaDeObjetos.pop());
		System.out.println("segundo objeto = " + pilaDeObjetos.pop());
		System.out.println("tercer objeto  = " + pilaDeObjetos.pop());
	}
}
